import puppeteer from "puppeteer";
import { WSE_LIST } from "./puppeteer-pool.js";

/**
 * 获取指定url的html源码
 * @param {string} url
 * @returns Promise<string>
 */
export async function spider(url) {
  let tmp = Math.floor(Math.random() * WSE_LIST.length);
  console.log(tmp);
  //随机获取浏览器
  let browserWSEndpoint = WSE_LIST[tmp];
  //使用节点来建立puppeteer与浏览器的连接
  const browser = await puppeteer.connect({
    browserWSEndpoint,
  });
  //打开一个标签页
  var page = await browser.newPage();

  // 启用请求拦截器
  await page.setRequestInterception(true);
  page.on("request", (req) => {
    // 仅支持加载html文档，js脚本，样式文件, 和发起ajax请求(请不要将样式禁止，有些项目会因为禁止加载样式，导致js执行出错)
    const whitelist = ["document", "script", "xhr", "fetch", "stylesheet"];
    if (!whitelist.includes(req.resourceType())) {
      // 非白名单类型的资源，则拒绝(请求将不会发出)
      return req.abort();
    }

    // 白名单类型的请求可以发出
    req.continue();
  });

  //打开网页
  const d3 = new Date().getTime();
  await page.goto(url, {
    timeout: 15000, //连接超时时间15秒，单位ms
    waitUntil: "load", //等到页内网络请求少于等于2个，且至少持续500ms时，则认为页面加载完毕
  });
  const d4 = new Date().getTime();
  console.log(`第一次计时: ${d4 - d3}`);

  // 获取网页源码
  const d1 = new Date().getTime();
  let html = await page.evaluate(() => {
    return document.getElementsByTagName("html")[0].outerHTML;
  });
  const d2 = new Date().getTime();
  console.log(`第二次计时: ${d2 - d1}`);
  await page.close();
  // 断开puppeteer与Chromium的连接(但 Chromium 进程仍然在运行)
  await browser.disconnect();

  // 关闭 Chromium (需要找个时机关闭浏览器,因为开太久也会有问题)
  // await browser.close();
  return html;
}
// console.log(WSE_LIST);
